package CONTABILIDAD_MODELO;
import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import java.text.SimpleDateFormat;

public class CON_COMPROBANTE{
    private double ID;
    private double ID_REGIONAL;
    private String TIPO;
    private Double TIPO_MONEDA;
    private String GLOSA;
    private String DESCRIPCION;
    private String CODIGO;
    private Date FECHA;
    private double CARGO_DE_CUENTA=1;
    private double ID_CARGO_DE_CUENTA;
    private String MONTO_LITERAL;
    private double MONTO_NUMERAL;
    private double ESTADO_RECURRENTE;
    private double CODIGO_RECURRENTE;
    private double ESTADO_ANULADO;
    private Conexion con = null;
    
    
    
    public CON_COMPROBANTE(){}
    
    public CON_COMPROBANTE(double MONTO_NUMERAL,String MONTO_LITERAL,double CARGO_DE_CUENTA,Date FECHA,String CODIGO,String DESCRIPCION,String GLOSA,String TIPO,double ID, double ESTADO_RECURRENTE, double CODIGO_RECURRENTE, double ID_REGIONAL){
        this.MONTO_NUMERAL =MONTO_NUMERAL;
        this.MONTO_LITERAL =MONTO_LITERAL;
        this.CARGO_DE_CUENTA =CARGO_DE_CUENTA;
        this.FECHA =FECHA;
        this.CODIGO =CODIGO;
        this.DESCRIPCION =DESCRIPCION;
        this.GLOSA =GLOSA;
        this.TIPO =TIPO;
        this.ESTADO_RECURRENTE =ESTADO_RECURRENTE;
        this.CODIGO_RECURRENTE =CODIGO_RECURRENTE;
        this.ID =ID;
        this.ID_REGIONAL =ID_REGIONAL;        
    }
    
    public boolean Insertar()throws Exception{
        String cargo="";
        String valor="";
        if(ID_CARGO_DE_CUENTA!=0){
            cargo=",ID_CARGO_DE_CUENTA ";
            valor=","+ID_CARGO_DE_CUENTA+"";
        }
         java.sql.Timestamp time = new java.sql.Timestamp(FECHA.getTime());
        String consulta = "INSERT INTO BROKER.CON_COMPROBANTE (ID, TIPO, GLOSA, DESCRIPCION, CODIGO, FECHA, CARGO_DE_CUENTA, MONTO_LITERAL, MONTO_NUMERAL,  ESTADO_RECURRENTE, CODIGO_RECURRENTE, ID_REGIONAL "+cargo+") VALUES (0, '"+TIPO+"', '"+GLOSA+"', '"+DESCRIPCION+"', '"+CODIGO+"', to_date('"+getFECHA()+"', 'DD/MONTH/YYYY HH:MI:SS'), "+CARGO_DE_CUENTA+", '"+MONTO_LITERAL+"', "+MONTO_NUMERAL+","+ESTADO_RECURRENTE+", "+CODIGO_RECURRENTE+", "+ID_REGIONAL+valor+")";
        con.EjecutarSentencia(consulta);
        consulta = "select BROKER.CON_COMPROBANTE_SEQ.currval as ID from dual";
        ResultSet rs = con.EjecutarConsulta(consulta);
        if(rs.next())
            this.ID=rs.getInt("ID");
        
        return true;
    }
    public boolean Update() throws Exception
    {
       String cargo="";
        String valor="";
        if(ID_CARGO_DE_CUENTA!=0){
            cargo=",ID_CARGO_DE_CUENTA ";
            valor=","+ID_CARGO_DE_CUENTA+"";
        }
         java.sql.Timestamp time = new java.sql.Timestamp(FECHA.getTime());
        String consulta = "update BROKER.CON_COMPROBANTE set TIPO = '"+TIPO+"', GLOSA = '"+GLOSA+"', DESCRIPCION = '"+DESCRIPCION+"', CODIGO = '"+CODIGO+"', FECHA = to_date('"+getFECHA()+"', 'DD/MONTH/YYYY HH:MI:SS'), CARGO_DE_CUENTA = "+CARGO_DE_CUENTA+", MONTO_LITERAL = '"+MONTO_LITERAL+"', MONTO_NUMERAL = "+MONTO_NUMERAL+",  ESTADO_RECURRENTE ="+ESTADO_RECURRENTE+", CODIGO_RECURRENTE = "+CODIGO_RECURRENTE+", ID_REGIONAL "+cargo+"= "+ID_REGIONAL+valor+" where ID = "+getID();
        con.EjecutarSentencia(consulta);
        return true;
    }
    
    public boolean Cargo_Cuenta(boolean activar, double id)throws Exception{
        String consulta ="";
        if(activar)
        {
            consulta = "update BROKER.CON_COMPROBANTE set CARGO_DE_CUENTA= 0 where ID = "+id;
        }
        else
        {
            consulta = "update BROKER.CON_COMPROBANTE set CARGO_DE_CUENTA= 1 where ID = "+id;
        }
        con.EjecutarSentencia(consulta);
        return true;
    }
          
    
    public boolean AnularXid(){
        try{
            String consulta = "update BROKER.CON_COMPROBANTE set ESTADO_ANULADO = 1 where ID = "+getID();
            con.EjecutarSentencia(consulta);
            consulta = "delete from BROKER.CON_RECURRENTES_MENSUALES where ID_COMPROBANTE = "+getID();
            con.EjecutarSentencia(consulta);
            consulta = "delete from BROKER.CON_RECURRENTE_ANUAL where ID_COMPROBANTE = "+getID();
            con.EjecutarSentencia(consulta);
            return true;
        }
        catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }
    
    
    
    public CON_COMPROBANTE BuscarXRECURRENTE(double recurrente) throws SQLException{
        String consulta = "select * from BROKER.CON_COMPROBANTE where CODIGO_RECURRENTE = "+recurrente+" and ESTADO_RECURRENTE = 1";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);    
    }
    
    public CON_COMPROBANTE BuscarXid(double id){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE where ID = "+id;
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    public CON_COMPROBANTE desvincularCargo(double id){
        try{String consulta = "update BROKER.CON_COMPROBANTE set ID_CARGO_DE_CUENTA=null where ID = "+id;
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    
    public CON_COMPROBANTE BuscarXCodigo(String codigo,double tipo){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE where CODIGO like('"+codigo+"') and TIPO='"+tipo+"'";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    
  
    
    public boolean Update(int id, String glosa, String descripcion, Double idreg) throws Exception
    {
        String consulta = "update BROKER.CON_COMPROBANTE set GLOSA='"+glosa+"', DESCRIPCION='"+descripcion+"', ID_REGIONAL = "+idreg+"  where CODIGO_RECURRENTE = "+id;
        con.EjecutarSentencia(consulta);        
        return true;
    }
    
    public boolean UpdateRecurrente(Double codigo_rec) throws Exception
    {
        String consulta = "update BROKER.CON_COMPROBANTE set CODIGO_RECURRENTE="+codigo_rec+"  where ID = "+ID;
        con.EjecutarSentencia(consulta);        
        return true;
    }
    
    public CON_COMPROBANTE Buscar(String codigo, double tipo) throws Exception{
        String consulta = "select * from BROKER.CON_COMPROBANTE where CODIGO like ('"+codigo+"') and TIPO like('"+tipo+"')";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs).get(0);
    }
    public List<CON_COMPROBANTE> BuscarRapida(String desc, double tipo,String estado,String cargoCuenta,String ultimo) throws Exception{
        String aux="";
        if(cargoCuenta.equals("0") && estado.equals("0")){
            aux="and CARGO_DE_CUENTA=0";
        }
        String consulta = "SELECT * FROM (select  *  from BROKER.CON_COMPROBANTE where (UPPER(CODIGO) like (UPPER('%"+desc+"%')) or UPPER(DESCRIPCION) like (UPPER('%"+desc+"%')) or  UPPER(GLOSA) like (UPPER('%"+desc+"%'))) and TIPO like('"+tipo+"') and ESTADO_ANULADO="+estado+" and ESTADO_RECURRENTE=0 "+aux+" and CODIGO like ('%"+ultimo+"') ORDER BY ID desc) WHERE ROWNUM <201  ";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    public List<CON_COMPROBANTE> BuscarCargoCuenta(double id_comprobante){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE where ID_CARGO_DE_CUENTA = "+id_comprobante +"and ESTADO_ANULADO <> 1";
                ResultSet rs = con.EjecutarConsulta(consulta);
                return Cargar(rs);
        }
        catch(Exception e){
                e.printStackTrace();}
                return null;
    }
    public List<CON_COMPROBANTE> BuscarAvanzada(double tipo,String codigo,String concepto,String desde,String glosaDetalle,String hasta,String descripcion, double montoDesde,double montoHasta,String estado,String cargoCuenta) throws Exception{
        String res="";
        if(codigo.length()>0){
            res+=" and UPPER(con.CODIGO) like (UPPER('%"+codigo.trim()+"%'))";
        }
        if(montoDesde+montoHasta>0){
            if(montoDesde>0 && montoHasta>0){
                res+=" and con.MONTO_NUMERAL >= "+montoDesde+" and con.MONTO_NUMERAL <="+montoHasta;
            }
            if(montoDesde>0 && montoHasta==0 ){
                res+=" and con.MONTO_NUMERAL = "+montoDesde;
            }
        }
        if((desde+hasta).length()>0){
            if(desde.length()>0 && hasta.length()>0){
                res+="and con.FECHA between to_date( '"+desde+"','MM/DD/YYYY') and to_date('"+hasta+"','MM/DD/YYYY')";
            }
            if(desde.length()>0 && hasta.length()==0){
                res+="and con.FECHA like to_char(to_date('"+desde+"','MM/DD/YYYY'))";
            }
        }
        if(concepto.length()>0){
            res+=" and UPPER(con.GLOSA) like(UPPER('%"+concepto.trim()+"%'))";
        }
        if(descripcion.length()>0){
            res+=" and UPPER(con.DESCRIPCION) like(UPPER('%"+descripcion.trim()+"%'))";
        }
        if(glosaDetalle.length()>0){
            res+="and con.ID in (select C.ID_COMPROBANTE from BROKER.CON_CUENTA_COMPROBANTE C where UPPER(C.GLOSA) LIKE(UPPER('%"+glosaDetalle.trim()+"%')) group by C.ID_COMPROBANTE)";
        }
        String aux="";
        if(cargoCuenta.equals("0") && estado.equals("0")){
            aux="and CARGO_DE_CUENTA=0";
        }
        String consulta = "SELECT * FROM (select * from BROKER.CON_COMPROBANTE con where con.TIPO like('"+tipo+"') "+res+" and ESTADO_ANULADO="+estado+" and ESTADO_RECURRENTE=0 "+aux+" ORDER BY ID desc) WHERE ROWNUM <201";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    public List<CON_COMPROBANTE> BusquedaTipo(double tipo,String estado,String cargoCuenta,String ultimo) throws Exception{
        String aux="";
        if(cargoCuenta.equals("0") && estado.equals("0")){
            aux="and CARGO_DE_CUENTA=0";
        }
        String consulta = "SELECT * FROM (select * from BROKER.CON_COMPROBANTE where  TIPO like('"+tipo+"%') and ESTADO_ANULADO="+estado+" and ESTADO_RECURRENTE=0 "+aux+" and CODIGO like ('%"+ultimo+"')ORDER BY ID desc) WHERE rownum <201 ";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);
    }
    
    public int GenerarCodigoComprobante(double tipo,int mes ,int ano)
    {        
        try{
        
            String consulta = "SELECT CON_COMPROBANTE.* \n" +
                            "FROM BROKER.CON_COMPROBANTE \n" +
                            "WHERE(CON_COMPROBANTE.TIPO = '"+tipo+"') \n" +
                            "AND(CON_COMPROBANTE.CODIGO LIKE '%-"+mes+"-"+ano+"') \n" +
                            "AND CON_COMPROBANTE.ID =(select max(id) from BROKER.con_comprobante where  (CON_COMPROBANTE.TIPO = '"+tipo+"')AND(CON_COMPROBANTE.CODIGO LIKE '%-"+mes+"-"+ano+"') )";
            ResultSet rs = con.EjecutarConsulta(consulta);
            List<CON_COMPROBANTE> comp = Cargar(rs);
            if(comp.size()==0)
            {
                return 1;
            }
            else
            {
                String a = comp.get(0).getCODIGO();
                a=a.split("-")[0];
                return Integer.parseInt(a)+1;
            }
        }
        catch(Exception e){
            return 1;
        }
        
    }
    
    
    
    public List<CON_COMPROBANTE> Todos(){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE ";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    public List<CON_COMPROBANTE> TodosActivos(){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE cc where cc.ESTADO_ANULADO =0 and CODIGO_RECURRENTE =0 ORDER BY (cc.FECHA)";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    public List<CON_COMPROBANTE> TodosxMesAbierto(){
        try{String consulta = "select * from BROKER.CON_COMPROBANTE";
        ResultSet rs = con.EjecutarConsulta(consulta);
        return Cargar(rs);}
        catch(Exception e){
            e.printStackTrace();}
        return null;
    }
    
    public List<CON_COMPROBANTE> Cargar(ResultSet rs){
        try{
            List<CON_COMPROBANTE> lista = new ArrayList<CON_COMPROBANTE>();
            while(rs.next()){
                CON_COMPROBANTE objeto = new CON_COMPROBANTE();
                
                objeto.setMONTO_NUMERAL(rs.getDouble("MONTO_NUMERAL"));
                objeto.setESTADO_RECURRENTE(rs.getDouble("ESTADO_RECURRENTE"));
                objeto.setMONTO_LITERAL(rs.getString("MONTO_LITERAL"));
                objeto.setCARGO_DE_CUENTA(rs.getDouble("CARGO_DE_CUENTA"));
                objeto.setFECHA(rs.getDate("FECHA"));
                objeto.setCODIGO(rs.getString("CODIGO"));
                objeto.setCODIGO_RECURRENTE(rs.getDouble("CODIGO_RECURRENTE"));
                objeto.setDESCRIPCION(rs.getString("DESCRIPCION"));
                objeto.setTIPO_MONEDA(rs.getDouble("TIPO_MONEDA"));
                objeto.setGLOSA(rs.getString("GLOSA"));
                objeto.setTIPO(rs.getString("TIPO"));
                objeto.setID(rs.getDouble("ID"));
                objeto.setESTADO_ANULADO(rs.getDouble("ESTADO_ANULADO"));
                objeto.setID_REGIONAL(rs.getDouble("ID_REGIONAL"));
                objeto.setCon(con);
                lista.add(objeto);
            }
            return lista;
        }
        catch(SQLException ex){
            ex.printStackTrace();
            return null;}
    }
    
    public double getID_REGIONAL() {
        return ID_REGIONAL;
    }
    
    public void setID_REGIONAL(double ID_REGIONAL) {
        this.ID_REGIONAL = ID_REGIONAL;
    }
    
    
    
    public double getMONTO_NUMERAL(){
        return MONTO_NUMERAL;
    }
    public void setMONTO_NUMERAL(double MONTO_NUMERAL){
        this.MONTO_NUMERAL=MONTO_NUMERAL;
    }
    
    public String getMONTO_LITERAL(){
        return MONTO_LITERAL;
    }
    public void setMONTO_LITERAL(String MONTO_LITERAL){
        this.MONTO_LITERAL=MONTO_LITERAL;
    }
    
    public Double getCARGO_DE_CUENTA(){
        return CARGO_DE_CUENTA;
    }
    public void setCARGO_DE_CUENTA(Double CARGO_DE_CUENTA){
        this.CARGO_DE_CUENTA=CARGO_DE_CUENTA;
    }
    
    public String getFECHA(){
        SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
        return sdf.format(FECHA);
    }
    public void setFECHA(Date FECHA){
        this.FECHA=FECHA;
    }
    
    public String getCODIGO(){
        return CODIGO;
    }
    public void setCODIGO(String CODIGO){
        this.CODIGO=CODIGO;
    }
    
    public String getDESCRIPCION(){
        return DESCRIPCION;
    }
    public void setDESCRIPCION(String DESCRIPCION){
        this.DESCRIPCION=DESCRIPCION;
    }
    
    public String getGLOSA(){
        return GLOSA;
    }
    public void setGLOSA(String GLOSA){
        this.GLOSA=GLOSA;
    }
    
    public String getTIPO(){
        return TIPO;
    }
    public void setTIPO(String TIPO){
        this.TIPO=TIPO;
    }
    
    public double getID(){
        return ID;
    }
    public void setID(double ID){
        this.ID=ID;
    }
    
    public Conexion getCon() {
        return con;
    }
    public void setCon(Conexion con) {
        this.con = con;
    }
    
    public double getESTADO_RECURRENTE() {
        return ESTADO_RECURRENTE;
    }
    
    public void setESTADO_RECURRENTE(double ESTADO_RECURRENTE) {
        this.ESTADO_RECURRENTE = ESTADO_RECURRENTE;
    }
    
    public double getCODIGO_RECURRENTE() {
        return CODIGO_RECURRENTE;
    }
    
    public void setCODIGO_RECURRENTE(double CODIGO_RECURRENTE) {
        this.CODIGO_RECURRENTE = CODIGO_RECURRENTE;
    }
    
    public double getESTADO_ANULADO() {
        return ESTADO_ANULADO;
    }
    
    public void setESTADO_ANULADO(double ESTADO_ANULADO) {
        this.ESTADO_ANULADO = ESTADO_ANULADO;
    }

    public Double getTIPO_MONEDA() {
        return TIPO_MONEDA;
    }

    public void setTIPO_MONEDA(Double TIPO_MONEDA) {
        this.TIPO_MONEDA = TIPO_MONEDA;
    }

    public double getID_CARGO_DE_CUENTA() {
        return ID_CARGO_DE_CUENTA;
    }

    public void setID_CARGO_DE_CUENTA(double ID_CARGO_DE_CUENTA) {
        this.ID_CARGO_DE_CUENTA = ID_CARGO_DE_CUENTA;
    }
    
    
}
